home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / network / file-tra / fsp-2.7 / fsp-2 / fsp / vms_src / miscvms.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-10  |  6.6 KB  |  302 lines

  1. /* Some unix emulation procedures */
  2. /* 1-NOV-1990 GJC@MITECH.COM */
  3. /* 24-DEC-1992 modified for use with VMS-fsp, <S.A.Pechler@bdk.tue.nl> */
  4. /* 05-MAR-1993 added some CPU-friendly fsp-patches */
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <descrip.h>
  9. #include <rms.h>
  10. #include <ssdef.h>
  11. #include <stat.h>
  12.  
  13. #include "pwd.h"
  14.  
  15. #define fexist(A) (!vms_access(A,0))
  16.  
  17. /* Ignore these functions on VMS.
  18.  */
  19. char *getlogin(void)
  20. {
  21.  return (char *)0;
  22. }
  23.  
  24. struct passwd *getpwnam(char *dummy)
  25. {
  26.  return (struct passwd *)0;
  27. }
  28.  
  29. struct passwd *getpwuid(uid_t dummy)
  30.   return (struct passwd *)0;
  31. }
  32.  
  33. /* strcasecmp */
  34. int strcasecmp(char *name1, char *name2)
  35. {
  36.  return(strcmp(name1,name2));
  37. }
  38.  
  39. /* vms_access
  40.  * Just a simple patch for VMS-fsp, it checks for the existance of a
  41.  * file, regardless of the 'dummy' parameter (was originally
  42.  * protection-flag).
  43.  */
  44. int vms_access(file,dummy)
  45. char *file;
  46. int dummy;
  47. {
  48.  struct FAB fab;
  49.  char filename[255];
  50.  
  51.  if (convfile(filename,file)) return 1;
  52.  fab=cc$rms_fab;
  53.  fab.fab$l_fna=filename;
  54.  fab.fab$b_fns=strlen(filename);
  55.  if (sys$open(&fab) != RMS$_NORMAL) return 1;
  56.  else sys$close(&fab);
  57.  return 0;
  58. }
  59.  
  60. /* vms_stat
  61.  * Just a simple patch, returns only filetype DIR or REG in struct stat. 
  62.  */
  63. int vms_stat(file,vstat)
  64. char *file;
  65. struct stat *vstat;
  66. {
  67.  struct FAB fab;
  68.  struct NAM nam;
  69.  char exp_str[NAM$C_MAXRSS];
  70.  char res_str[NAM$C_MAXRSS];
  71.  
  72.  char filename[255];
  73.  
  74.  /* convert the filename to VMS-format */
  75.  if (convfile(filename,file)) return 1;
  76.  
  77.  /* fill in nam-block */
  78.  nam= cc$rms_nam;
  79.  nam.nam$l_rsa= res_str;
  80.  nam.nam$b_rss= NAM$C_MAXRSS;
  81.  nam.nam$l_esa= exp_str;
  82.  nam.nam$b_ess= NAM$C_MAXRSS;
  83.  
  84.  /* fill in fab-block */
  85.  fab= cc$rms_fab;
  86.  fab.fab$l_nam= &nam;
  87.  fab.fab$l_fop= fab.fab$v_nam;
  88.  fab.fab$l_fna= filename;
  89.  fab.fab$b_fns= (unsigned char)strlen(filename);
  90.  
  91.  sys$parse(&fab); /* needed for completion nam-block */
  92.  if (sys$search(&fab) != RMS$_NORMAL)
  93.  {
  94.   if (filename[strlen(filename)-1]==']')  /* kludge to check for dir-path */
  95.   { vstat->st_mode=S_IFDIR;
  96.     return 0;
  97.   }
  98.   else return 1;
  99.  }
  100.  
  101.  /* if name ends on .DIR;1 then it's a dir (Will go wrong when you have
  102.     files with a .DIR;1 extension). */
  103.  if (strncmp(".DIR;1",nam.nam$l_type,6)) vstat->st_mode=S_IFREG;
  104.  else vstat->st_mode=S_IFDIR;
  105.  return 0;
  106. }
  107.  
  108. /* isvariable
  109.  * returns true if file is in variable record length format.
  110.  */
  111. int isvariable(sb)
  112. struct stat sb;
  113. {
  114. return (int)(sb.st_fab_rfm==FAB$C_VAR || sb.st_fab_rfm==FAB$C_VFC);
  115. }
  116.  
  117. #ifndef bcopy /* only for UCX systems */
  118. bcopy(x,y,n)
  119.      char *x,*y;
  120.      long n;
  121. {memmove(y,x,n);}    /* reverse order of arguments */
  122. #endif
  123.  
  124. static char *getwd_tmp = NULL;
  125.  
  126. char *getwd(p)
  127.      char *p;
  128. {
  129.  int c;
  130.  char *root_dir,*l2;
  131.  getcwd(p,512,0);    /* get current working directory in unix format*/
  132.  
  133.  root_dir = strstr ( p, "/000000" );
  134.  if ( root_dir != NULL ) {
  135.     /* trim root directory out of specification */
  136.     if ( (strlen(root_dir) == 7) && 
  137.      (strpbrk(p+1,"/") == root_dir) ) *root_dir = '\0';
  138.  }
  139.  /* special kludge for "/" directory */
  140.  if ( strcmp ( p, "/DEVICE_LIST_ROOT" ) == 0 ) strcpy  ( p, "/" );
  141.  return(p);
  142. }
  143.  
  144. /*
  145. ** HARDLINK emulation, just a filecopy on VMS.
  146. */
  147. #ifndef link
  148. long
  149. link(source,target)
  150.  char *source;
  151.  char *target;
  152.  
  153. {
  154.  FILE *ft, *fp;
  155.  char buf[512];
  156.  int bytes;
  157.  
  158.  if (fexist(target)) return(-1); /* target already exists */
  159. #ifdef DEBUG
  160.  printf("link: source: %s, target: %s\n",source,target);
  161. #endif
  162.  if(!(ft = fopen(source,"r","mbf=2","mbc=32"))) return(-1);
  163.  if(!(fp = fopen(target,"w","mbf=2","mbc=32"))) { fclose(ft); return(-1); }
  164.  /* copy source to target */
  165.  while(bytes = fread(buf,1,sizeof(buf),ft)) fwrite(buf,1,bytes,fp);
  166.  fclose(ft); fclose(fp);
  167.  return(0);
  168. }
  169. #endif
  170.  
  171. rindex(p,c)
  172.      char *p;
  173.      int c;
  174. {
  175.  return(strrchr(p,c));
  176. }
  177.  
  178. /*
  179.  * redefinition of lstat
  180.  */
  181. int lstat(f,st)        /* fake a stat operation to return file type */
  182.    char *f;
  183.    stat_t *st;
  184. {
  185.     char *dirext, *name;
  186.     int extlen;
  187.  
  188.     st->st_mode = S_IFREG;    /* default to normal file */
  189.     name = strrchr ( f, '/' );    /* locate rightmost slash */
  190.     if ( name == NULL ) name = f; else name++;
  191.  
  192.     dirext = strstr ( name, ".DIR" );
  193.     if ( dirext != NULL ) {
  194.     /* make it an exact match */
  195.     extlen = strcspn(&dirext[1],".;");
  196.         if ( (extlen == 0) || (extlen == 3) ) {
  197.         st->st_mode = S_IFDIR;
  198.         if ( strncmp ( name, "000000.", 7 ) == 0 ) return 0;
  199.         else return (stat ( f, st ));
  200.     }
  201.     }
  202.     return 0;
  203. }
  204.  
  205. do_vms_wildcard(pargc,pargv)
  206.      int *pargc;
  207.      char ***pargv;
  208. {int j,vsize;
  209.  int argc; char **argv;
  210.  argc = *pargc;
  211.  argv = *pargv;
  212.  *pargc = 0;
  213.  vsize = 3;
  214.  *pargv = (char **) malloc(sizeof (char *) * vsize);
  215.  for(j=0;j<argc;++j)
  216.    vms_wild_putargs(argv[j],pargc,pargv,&vsize);
  217. }
  218.  
  219. vms_wild_putargs(s,pargc,pargv,pvsize)
  220.      char *s; int *pargc; char ***pargv; int *pvsize;
  221. {if ( (!strchr(s,'*')) && (!strchr(s,'%')) )
  222.    vms_wild_put_one(s,pargc,pargv,pvsize);
  223.  else
  224.    vms_wild_put_wild(s,pargc,pargv,pvsize);
  225. }
  226.  
  227.  
  228. vms_wild_put_one(s,pargc,pargv,pvsize)
  229.      char *s; int *pargc; char ***pargv; int *pvsize;
  230. {int nvsize,i;
  231.  char ** nargv, *uname, *SHELL$TRANSLATE_VMS();
  232.  if (*pargc == *pvsize)
  233.    {nvsize = 2 * *pvsize;
  234.     nargv = (char **) malloc(sizeof (char *) * nvsize);
  235.     for(i=0;i < *pargc; ++i) nargv[i] = (*pargv)[i];
  236.     free(*pargv);
  237.     *pargv = nargv;
  238.     *pvsize = nvsize;}
  239.  if ( uname = SHELL$TRANSLATE_VMS ( s ) ) {
  240.     /* printf("vms: '%s' -> unix: '%s'\n", s, uname ); */
  241.     if ( strlen(s) >= strlen(uname) ) { strcpy(s,uname); free(uname); }
  242.     else s = uname;  /* will lose s's old allocation */
  243.  } 
  244.  (*pargv)[(*pargc)++] = s;
  245. }
  246.  
  247.  
  248. set_dsc(x,buff,len)
  249.  struct dsc$descriptor *x;
  250.  char *buff;
  251.  int len;
  252. {
  253.  (*x).dsc$w_length = len;
  254.  (*x).dsc$a_pointer = buff;
  255.  (*x).dsc$b_class = DSC$K_CLASS_S;
  256.  (*x).dsc$b_dtype = DSC$K_DTYPE_T;
  257.  return(x);
  258. }
  259.  
  260. struct dsc$descriptor *
  261. set_dsc_cst(x,buff)
  262.  struct dsc$descriptor *x;
  263.  char *buff;
  264. {
  265.  return(set_dsc(x,buff,strlen(buff)));
  266. }
  267.  
  268.  
  269. vms_wild_put_wild(s,pargc,pargv,pvsize)
  270.  char *s; int *pargc; char ***pargv; int *pvsize;
  271. {
  272.  struct dsc$descriptor fnamed,foutd,rfnamed;
  273.  char *ns,*p;
  274.  int rval;
  275.  long context;
  276.  
  277.  set_dsc_cst(&rfnamed,";");
  278.  set_dsc_cst(&fnamed,s);
  279.  set_dsc(&foutd,0,0);
  280.  foutd.dsc$b_class = DSC$K_CLASS_D;
  281.  context = 0;
  282.  while(1)
  283.   {rval = lib$find_file(&fnamed,&foutd,&context,0,&rfnamed,0,0);
  284.    if (rval == RMS$_NMF) break;
  285.    if (rval == RMS$_FNF) break;
  286.    if (rval != RMS$_NORMAL) exit(rval);
  287.    ns = (char *) malloc(foutd.dsc$w_length + 1);
  288.    ns[foutd.dsc$w_length] = 0;
  289.    memcpy(ns,foutd.dsc$a_pointer,foutd.dsc$w_length);
  290.    /*if (p = strchr(ns,']')) ns = p+1;*/
  291.    /* if (p = strchr(ns,';')) *p = 0; */
  292.    vms_wild_put_one(ns,pargc,pargv,pvsize);
  293.   }
  294.  if (foutd.dsc$a_pointer) lib$sfree1_dd(&foutd);
  295.  if (context)
  296.  { rval = lib$find_file_end(&context);
  297.    if (rval != SS$_NORMAL) exit(rval);
  298.  }
  299. }
  300.  
  301.